package com.xiangxiao.rpan.data.producer;

import com.xiangxiao.rpan.data.enums.MessageTypeEnum;
import com.xiangxiao.rpan.data.model.BaseAlarm;

import java.util.List;
import java.util.Set;

/**
 * @auther xiangxiao
 * @email 573768011@qq.com
 * @data 2024/5/11 15:25
 */
public interface AlarmProduce<M extends BaseAlarm>{
  /**
   * 获取操作类型(上传文件、上传文件夹、下载文件、下载文件夹)
   * @return
   */
  MessageTypeEnum getMessageTypeEnum();
  /**
   * 主告警逻辑，可自定义
   *
   * @param m
   */
  void alarm(M m);

  /**
   * 保存告警,并返回告警主键ID
   *
   * @param m
   */
  Integer saveAlarm(M m);

  /**
   * 发送mqtt 前的扩展处理
   *
   * @return
   */
  boolean sendMQTTBefore(M m);

  /**
   * 发送mqtt
   *
   * @param m
   */
  void sendMQTT(String topic, M m);

  /**
   * 发送mqtt 后的扩展处理
   *
   * @param m
   * @param userId
   */
  void sendMqttAfter(M m, Integer userId);

  /**
   * 设置发送告警用户ID
   * 目前是每个告警都单独处理获取，后续看是否需要优化，单个告警属于多个布控任务，批量获取
   */
  Set<Integer> getSendUserIdList(M m);


  /**
   * 获取MQTT 发送前缀
   *
   * @return
   */
  List<String> getMqttTopicPrefix(M m);

  /**
   * 将告警数据转换为mqtt数据
   *
   * @param m
   * @return
   */
  Object coverAlarmToMqttData(M m);
}
